<?php
declare(strict_types=1);

namespace Zms\Calculation\Traits;

use Exception;

trait Common
{

    /**
     * @var string 算式
     */
    private $formula;

    /**
     * 初始化
     * @param string $formula
     */
    public function __construct(string $formula)
    {
        $this->formula = $formula;
    }


    /**
     * @describe 检查表达式
     * @return void
     * @throws Exception
     * @user zlf zms-pro@qq.com 2025/1/10
     */
    private function validityCheckOfEquations()
    {
        //判断括号后面是否有运算符,没有就是错误的运算符
        $pattern = '/\)\s*\d+/'; // 匹配 ) 后面可有零个或多个空格后跟着一个或多个数字
        if (preg_match($pattern, $this->formula)) {
            throw new Exception("运算式错误");
        }

        //括号未闭合,非成对出现
        if (substr_count($this->formula, ')') !== substr_count($this->formula, '(')) {
            throw new Exception("运算式表达式错误");
        }
    }


    /**
     * @describe 四则运算
     * @user zlf <zms-pro@qq.com> 2025/3/19
     * @param string $formula 计算算式
     * @param int|null $precision 保留精度
     * @return float
     * @throws Exception
     */
    public static function compute($formula, $precision = null)
    {
        $value = (new self($formula))->startCount();
        if (is_null($precision)) {
            return $value;
        }
        return round($value, $precision);
    }


    /**
     * @describe 计算商品折扣
     *  算法  原价100，现价34
     *  折扣为  34/100=0.34  乘以10转为日常折扣单位 0.34*10=3.4折
     *
     * @user zlf <zms-pro@qq.com> 2025/4/27
     * @param $price
     * @param $line_price
     * @param int $precision
     * @return float|int
     * @throws Exception
     */
    public static function discount($price, $line_price, $precision = 1)
    {
        $price = floatval($price);
        $line_price = floatval($line_price);
        if (!($price > 0 && $line_price)) return 0;//有一个价格为0,无法计算
        if ($price >= $line_price) return 0;//和原价一样或大于原价,没打折
        return self::compute("({$price}/{$line_price}*10)", $precision);
    }
}